﻿using System;
using System.Collections.ObjectModel;
using System.Windows;
using Comunes.DataSet;
using Comunes.Validadores;
using Contratos.Aseguradora;
using MJD.Comunes.DtoEntidades;
using Recursos;

namespace Presentadores.Aseguradoras
{
    /// <summary>
    /// clase que hace de presentador para la vista de gestionar aseguradora
    /// </summary>
    public class PresentadorGestionarAseguradora:PresentadorBase
    {
        #region Atributos

        /// <summary>
        /// Objeto que posee las propiedades de la vista
        /// </summary>
        private IGestionarAseguradora _vista;


        /// <summary>
        /// objeto que posee la lista de sucursales que ha agregado el usuario
        /// </summary>
        private ObservableCollection<DataSetSucursal> _listaSucursales;
        #endregion

        #region Constructor

        /// <summary> Cosntructor de la clase </summary>
        /// <param name="vista">objeto que posee las propiedades de la vista</param>
        public PresentadorGestionarAseguradora(IGestionarAseguradora vista)
        {
            _vista = vista;
            CargarLetrasRif();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Metodo que se encarga de realizar las operacion requeridas para cargar la pagina
        /// </summary>
        public void CargarPagina()
        {
            _vista.PanelDatosAseguradoras.Visibility = Visibility.Collapsed;
            _vista.PanelListaAseguradoras.Visibility = Visibility.Collapsed;
            _vista.PanelListaSucursales.Visibility = Visibility.Collapsed;
        }


        /// <summary>
        /// Metodo que se ejecuta cuando se la da click al buscar aseguradora
        /// </summary>
        public void BuscarAseguradora()
        {
            _vista.PanelListaAseguradoras.Visibility = Visibility.Visible;
            
        }


        /// <summary>
        /// Metodo que muestra los controles adecuados para insertar una aseguradora 
        /// </summary>
        public void HabilitarInsercionAseguradora()
        {
            _vista.PanelBuscarAseguradoras.Visibility = Visibility.Collapsed;
            _vista.PanelDatosAseguradoras.Visibility = Visibility.Visible;
            _vista.PanelListaSucursales.Visibility = Visibility.Visible;
            _vista.PanelListaAseguradoras.Visibility = Visibility.Collapsed;
            _listaSucursales = new ObservableCollection<DataSetSucursal>();
            _vista.ListaSucursales.ItemsSource = _listaSucursales;
            _vista.AgregarAseguradora.Visibility = Visibility.Visible;
        }


        /// <summary>
        /// Metodo que muestra los datos de la aseguradora
        /// </summary>
        public void MostrarDetalleAseguradora()
        {
            
        }


        /// <summary>
        /// Metodo que habilita la ventana para agregar una nueva sucursal
        /// </summary>
        public void AgregarNuevaSucursal()
        {
            _vista.MostrarAgregarSucursal(true, null);
        }


        /// <summary> Metodo que almacena los datos de la sucursal indicados </summary>
        public void AgregarSucursal()
        {
            DtoSucursal sucursal = new DtoSucursal();
            sucursal.Apartamento = _vista.VentanaSucursal.Apartamento.Text;
            sucursal.Calle = _vista.VentanaSucursal.Calle.Text;
            sucursal.Ciudad = (DtoCiudad) _vista.VentanaSucursal.Ciudades.SelectedItem;
            sucursal.Ciudad.Estado = (DtoEstado) _vista.VentanaSucursal.Estados.SelectedItem;
            sucursal.Edificio = _vista.VentanaSucursal.Edificio.Text;
            sucursal.Piso = _vista.VentanaSucursal.Piso.Text;
            sucursal.Urbanizacion = _vista.VentanaSucursal.Urbanizacion.Text;
            sucursal.Telefono1 = _vista.VentanaSucursal.CodigoAreaTelefonoPrincipal.Text + "-" + _vista.VentanaSucursal.NumeroTelefonoPrincipal.Text;
            sucursal.Telefono2 = _vista.VentanaSucursal.CodigoAreaTelefonoSecundario.Text + "-" + _vista.VentanaSucursal.NumeroTelefonoSecundario.Text;
            sucursal.Tipo = (string) _vista.VentanaSucursal.TipoAseguradora.SelectedValue;

            DataSetSucursal objeto = new DataSetSucursal(sucursal);

            _listaSucursales.Add(objeto);
            _vista.ListaSucursales.ItemsSource = _listaSucursales;
        }



        /// <summary>
        /// Metodo que agrega la aseguradora con los datos indicados
        /// </summary>
        public void AgregarAseguradora()
        {
            if (ValidarControles())
            {
                if (_listaSucursales.Count == 0)
                    AgregarNuevaSucursal();
                else
                {
                    _vista.MostrarMensajeConfirmacion(Mensajes.ConfirmacionInsercionOModificacionAseguradora);
                }

            }
        }


        #endregion

        #region Metodos Privados

        /// <summary>
        /// Metodo que carga todas las letras rif que se encuentra en web config
        /// </summary>
        private void CargarLetrasRif()
        {
            string[] letras = GetAppSetting(Strings.PrefijosRif).Split(',');
            ObservableCollection<string> contenidoCombo = new ObservableCollection<string>();

            foreach (string prefijo in letras)
            {
                contenidoCombo.Add(prefijo);
            }

            _vista.LetraRif.ItemsSource = contenidoCombo;
            _vista.LetraRifBusqueda.ItemsSource = contenidoCombo;
            _vista.LetraRif.SelectedIndex = 0;
            _vista.LetraRifBusqueda.SelectedIndex = 0;
        }


        /// <summary> Evento que se ejecuta cuando el servicio de agregar aseguradora responde </summary>
        /// <param name="sender">Objeto que realiza el evento</param>
        /// <param name="e">objeto que posee arguemto del evento</param>
        private void ServicioInsertarOModifcarAseguradoraCompleted(object sender, InsertarOModifcarAseguradoraCompletedEventArgs e)
        {
            try
            {
                if(e.Result)
                {
                    _vista.MostrarMensajeNotificacion(Mensajes.ExitoInsercionModificacionAseguradora);
                }
            }
            catch (Exception)
            {
                
                throw;
            }
        }


        /// <summary> Metodo que valida  </summary>
        /// <returns>true si los controles son validos</returns>
        private bool ValidarControles()
        {
            bool retorno = true;

            _vista.NombreAseguradora.ClearValidationError();
            _vista.NumeroTelefono.ClearValidationError();
            _vista.NumeroRif.ClearValidationError();

            if (_vista.NombreAseguradora.Text.Equals(string.Empty))
            {
                _vista.NombreAseguradora.SetValidation(Mensajes.CampoRequerido);
                _vista.NombreAseguradora.RaiseValidationError();
                retorno = false;
            }

            if (_vista.CodigoArea.Text.Equals(string.Empty))
            {
                _vista.CodigoArea.SetValidation(Mensajes.CampoRequerido);
                _vista.CodigoArea.RaiseValidationError();
                retorno = false;
            }
            else if (!_vista.CodigoArea.Text.SoloNumeros())
            {
                _vista.CodigoArea.SetValidation(Mensajes.SoloNumeros);
                _vista.CodigoArea.RaiseValidationError();
                retorno = false;
            }
            else if (_vista.CodigoArea.Text.Length != 4)
            {
                _vista.CodigoArea.SetValidation(Mensajes.CodigoIncorrecto);
                _vista.CodigoArea.RaiseValidationError();
                retorno = false;
            }
            else if (!_vista.NumeroTelefono.Text.Equals(string.Empty) &&
                !_vista.NumeroTelefono.Text.SoloNumeros())
            {
                _vista.NumeroTelefono.SetValidation(Mensajes.SoloNumeros);
                _vista.NumeroTelefono.RaiseValidationError();
                retorno = false;
            }
            else if (_vista.CodigoArea.Text.Equals(string.Empty) && !_vista.NumeroTelefono.Text.Equals(string.Empty))
            {
                _vista.CodigoArea.SetValidation(Mensajes.CampoRequerido);
                _vista.NumeroTelefono.SetValidation(Mensajes.CampoRequerido);
                _vista.CodigoArea.RaiseValidationError();
                _vista.NumeroTelefono.RaiseValidationError();
                retorno = false;
            }
            else if (!_vista.CodigoArea.Text.Equals(string.Empty) && _vista.NumeroTelefono.Text.Equals(string.Empty))
            {
                _vista.CodigoArea.SetValidation(Mensajes.CampoRequerido);
                _vista.NumeroTelefono.SetValidation(Mensajes.CampoRequerido);
                _vista.CodigoArea.RaiseValidationError();
                _vista.NumeroTelefono.RaiseValidationError();
                retorno = false;
            }
            else if ((_vista.CodigoArea.Text.Equals(string.Empty) && _vista.NumeroTelefono.Text.Equals(string.Empty)))
            {

                _vista.CodigoArea.SetValidation(Mensajes.CampoRequerido);
                _vista.NumeroTelefono.SetValidation(Mensajes.CampoRequerido);
                _vista.CodigoArea.RaiseValidationError();
                _vista.NumeroTelefono.RaiseValidationError();
                retorno = false;
            }

            if (_vista.NumeroRif.Text.Equals(string.Empty))
            {
                _vista.NumeroRif.SetValidation(Mensajes.CampoRequerido);
                _vista.NumeroRif.RaiseValidationError();
                retorno = false;
            }
            else if (!_vista.NumeroRif.Text.SoloNumeros())
            {
                _vista.NumeroRif.SetValidation(Mensajes.SoloNumeros);
                _vista.NumeroRif.RaiseValidationError();
                retorno = false;
            }


            return retorno;
        }

        #endregion

        /// <summary> Metodo que se ejecuta cuando se acepta la venta de confirmacion  de la insercion o modificacion </summary>
        /// <param name="sender">Objeto que realiza el evento</param>
        /// <param name="e">objeto que posee arguemto del evento</param>
        public void ConfirmacionAgregarOModificarAseguradora(object sender, EventArgs e)
        {

            DtoAseguradora aseguradora = new DtoAseguradora();
            aseguradora.Nombre = _vista.NombreAseguradora.Text;
            aseguradora.LetraRif = Convert.ToChar(_vista.LetraRif.SelectedValue.ToString());
            aseguradora.Rif = Convert.ToInt64(_vista.NumeroRif.Text);
            aseguradora.Sucursales = new DtoSucursal[_listaSucursales.Count];
            aseguradora.Estatus = 1;
            aseguradora.Telefono = _vista.CodigoArea.Text + "-" + _vista.NumeroTelefono.Text;
            int i = 0;
            foreach (DataSetSucursal dataSetSucursal in _listaSucursales)
            {
                aseguradora.Sucursales[i] = dataSetSucursal.Objeto;
                i++;
            }
            WsEmpresaClient servicio = new WsEmpresaClient();
            servicio.InsertarOModifcarAseguradoraCompleted += ServicioInsertarOModifcarAseguradoraCompleted;
            servicio.InsertarOModifcarAseguradoraAsync(aseguradora);
        }
    }
}
